package redtankface.tasks;

import redtankface.EnemyInfo;
import redtankface.RedTankFace;
import redtankface.TankUtils;

/**
 * RunAwayTask - задача убегания от врага
 */
public class RunAwayTask extends AbstractTankChooseTask {
	/** Минимальная дистанция до врага, после кторой дается доп. бонус на убегание */
	private static final double MIN_DISTANCE_LIMIT = 200;
	/** Доп. цена бонуса при убегании на мин. дистанции. Тем больше, чем ближе мы к врагу */
	private static final double DISTANCE_COST = 5;
	/** Угол, на который поворачиваем при отходе. Задается снаружи */
	private final double ANGLE_AJUSTMENT;
	/** Угол, на который мы будем поворачивать танк */
	private volatile double rotate_angle = 0;
	/** Цена поворота танка при отступлении */
	private static final double ROTATE_COST = 10;
	/** На сколько будем отъезжать */
	private static final double RUN_AWAY_LENGTH = 100;
	/** Минимальное расстояние до стены */
	private static final double MIN_WALL_DISTANCE = 300;
	/** Штраф за удар в стену */
	private static final double WALL_HIT_WEIGHT = 500;

	public RunAwayTask(RedTankFace aRobot, double aAngleAjustment) {
		super(aRobot);
		ANGLE_AJUSTMENT = aAngleAjustment;
	}

	@Override
	protected long getLocalRating(EnemyInfo aEnemy, double distance, double heading) {
		double cost = 25;
		if (distance < MIN_DISTANCE_LIMIT) {
			cost += (MIN_DISTANCE_LIMIT - distance) * DISTANCE_COST;
		}
		// Валить будем на 180 градусов от врага + ещё чуть-чуть, чтобы неудобно было палить :))
		heading = heading + Math.PI + ANGLE_AJUSTMENT;
		// Нормированный угол, на который мы будем поворачивать танк, чтобы свалить
		rotate_angle = robocode.util.Utils.normalRelativeAngle(heading - Math.toRadians(mRobot.getHeading()));
		cost -= Math.abs(rotate_angle) * ROTATE_COST;

		if (MIN_WALL_DISTANCE > TankUtils.getDistanceToWall(mRobot.getCoord(), heading, mRobot)) {
			cost -= WALL_HIT_WEIGHT;
		}

		return (long)cost;
	}

	@Override
	protected void p_doTask() {
		// Поворачиваемся и отъезжаем
		mRobot.turnRight(rotate_angle);
		mRobot.ahead(RUN_AWAY_LENGTH);
	}
}
